package singleton.type6;

/**
 * 双重检查
 * 这样，实例化代码只用执行一次，后面再次访问时，判断if (singleton == null)，直接return实例化对象，也避免的反复进行方法同步.
 * 线程安全；延迟加载；效率较高
 * 结论：在实际开发中，推荐使用这种单例设计模式
 * 
 * 
 * @author DFD
 * @date 2023年11月9日
 */
public class Singleton {

	public static void main(String[] args) {
		Singleton instance1 = Singleton.getInstance();
		Singleton instance2 = Singleton.getInstance();
		System.out.println(instance1 == instance2);
	}

	// 保证可见性，一个线程修改后，其他线程立刻拿到最新值
	private static volatile Singleton instance;

	private Singleton() {

	}

	public static Singleton getInstance() {
		if (null == instance) {
			// 如果如果有线程已经完成对象创建了，及时进来了也会直接返回
			synchronized (Singleton.class) {
				if (instance == null) {
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}
